]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
Magnifier: don't listen for focus/tracker events if the magnifier is not active
authorGiovanni Campagna <gcampagna@src.gnome.org>
Thu, 13 Feb 2014 15:25:24 +0000 (16:25 +0100)
committerGiovanni Campagna <gcampagna@src.gnome.org>
Thu, 13 Feb 2014 18:43:41 +0000 (19:43 +0100)
In addition to checking the current settings, check also if the
zoom region is active before registering the event listener.
This way, we avoid DBus traffic for events we're not interested in.

Also, make FocusCaretTracker resilient to multiple register/deregister
calls (which can now happen).

https://bugzilla.gnome.org/show_bug.cgi?id=724305

js/ui/focusCaretTracker.js
js/ui/magnifier.js

index 5af8d37dbb99a02bdcedcf17fac46562700b9410..beaf2de0f2ebafe260874c12d61876ef57453763 100644 (file)
@@ -34,7 +34,11 @@ const FocusCaretTracker = new Lang.Class({
     _init: function() {
         Atspi.init();
         Atspi.set_timeout(250, 250);
+
         this._atspiListener = Atspi.EventListener.new(Lang.bind(this, this._onChanged));
+
+        this._focusListenerRegistered = false;
+        this._caretListenerRegistered = false;
     },
 
     _onChanged: function(event) {
@@ -45,21 +49,39 @@ const FocusCaretTracker = new Lang.Class({
     },
 
     registerFocusListener: function() {
-        return this._atspiListener.register(STATECHANGED + ':focused') &&
-               this._atspiListener.register(STATECHANGED + ':selected');
+        if (this._focusListenerRegistered)
+            return;
+
+        // Ignore the return value, we get an exception if they fail
+        // And they should never fail
+        this._atspiListener.register(STATECHANGED + ':focused');
+        this._atspiListener.register(STATECHANGED + ':selected');
+        this._focusListenerRegistered = true;
     },
 
     registerCaretListener: function() {
-        return this._atspiListener.register(CARETMOVED);
+        if (this._caretListenerRegistered)
+            return;
+
+        this._atspiListener.register(CARETMOVED);
+        this._caretListenerRegistered = true;
     },
 
     deregisterFocusListener: function() {
-        return this._atspiListener.deregister(STATECHANGED + ':focused') &&
-               this._atspiListener.deregister(STATECHANGED + ':selected');
+        if (!this._focusListenerRegistered)
+            return;
+
+        this._atspiListener.deregister(STATECHANGED + ':focused');
+        this._atspiListener.deregister(STATECHANGED + ':selected');
+        this._focusListenerRegistered = false;
     },
 
     deregisterCaretListener: function() {
-        return this._atspiListener.deregister(CARETMOVED);
+        if (!this._caretListenerRegistered)
+            return;
+
+        this._atspiListener.deregister(CARETMOVED);
+        this._caretListenerRegistered = false;
     }
 });
 Signals.addSignalMethods(FocusCaretTracker.prototype);
index b02b1146c63c5e8906a5acfce2844dc7ea8de63a..f64ac3b99da39bb29a5662fb508d85276ec99a60 100644 (file)
@@ -766,6 +766,9 @@ const ZoomRegion = new Lang.Class({
         } else {
             this._destroyActors();
         }
+
+        this._syncCaretTracking();
+        this._syncFocusTracking();
     },
 
     /**
@@ -825,10 +828,7 @@ const ZoomRegion = new Lang.Class({
      */
     setFocusTrackingMode: function(mode) {
         this._focusTrackingMode = mode;
-        if (this._focusTrackingMode == GDesktopEnums.MagnifierFocusTrackingMode.NONE)
-            this._focusCaretTracker.deregisterFocusListener();
-        else
-            this._focusCaretTracker.registerFocusListener();
+        this._syncFocusTracking();
     },
 
     /**
@@ -837,10 +837,27 @@ const ZoomRegion = new Lang.Class({
      */
     setCaretTrackingMode: function(mode) {
         this._caretTrackingMode = mode;
-        if (this._caretTrackingMode == GDesktopEnums.MagnifierCaretTrackingMode.NONE)
-            this._focusCaretTracker.deregisterCaretListener();
+        this._syncCaretTracking();
+    },
+
+    _syncFocusTracking: function() {
+        let enabled = this._focusTrackingMode != GDesktopEnums.MagnifierFocusTrackingMode.NONE &&
+            this.isActive();
+
+        if (enabled)
+            this._focusCaretTracker.registerFocusListener();
         else
+            this._focusCaretTracker.deregisterFocusListener();
+    },
+
+    _syncCaretTracking: function() {
+        let enabled = this._caretTrackingMode != GDesktopEnums.MagnifierCaretTrackingMode.NONE &&
+            this.isActive();
+
+        if (enabled)
             this._focusCaretTracker.registerCaretListener();
+        else
+            this._focusCaretTracker.deregisterCaretListener();
     },
 
     /**